﻿#pragma once

#include "Object/Object.h"
#include "Math/IntPoint.h"
#include "PixelObjectID.h"
#include "PixelObject.h"
#include "PixelObjectMap.m.h"

class CRenderPixelObjectMap;
class CPixelObject;

//这是一个渲染目标
//每个像素都对应着一个对象
//主要用于鼠标点选场景物体
RCLASS()
class WHENGINE_API RPixelObjectMap : public RObject
{
    ROBJECT

public:
    RPixelObjectMap();

    //写入数据，在主线程调用
    void WriteData(
         uint32_t InViewportWidth
        , uint32_t InViewportHeight
        , uint32_t InWidth
        , uint32_t InHeight
        , uint32_t InPitch
        , TVector<uint8_t>&& InData);

    std::shared_ptr<CRenderPixelObjectMap> GetRenderObject() const
    {
        return RenderData;
    }

    //查询像素对象
    //如果参数错误或者还没来得及写入数据(未完成渲染)，返回nullptr
    std::shared_ptr<CPixelObject> QueryPixelObject(const SIntPoint& InViewportPosition);

    //所有的像素对象
    SPixelObjects PixelObjects;
protected:
    //视口的宽高
    uint32_t ViewportWidth=0;  
    uint32_t ViewportHeight=0;

    //图片的宽高
    //与视口的宽高不一定相同
    //由于这个是一个渲染目标，需要从显存中回读数据，存在效率问题
    //为了提高效率，图片总是比视口小，以减少回读数据的大小
    uint32_t Width=0;
    uint32_t Height=0;
    uint32_t Pitch=0;

    //像素数据，每个像素
    TVector<uint8_t> Data;

    std::shared_ptr<CRenderPixelObjectMap> RenderData;
};